#  引入合适的包
import numpy as np
import matplotlib.pyplot as plt
from skimage import io

#  此句话限制在不同平台生成随机数相同
#  以便之后答案的审核
np.random.seed(2021)

#  读入RGB图:  dog.jpg
img = io.imread("dog.jpg")

h, w, c = img.shape  # 获得图像的高h,宽w,通道数c

#  生成噪音图
#  1.  噪音图与狗图的结构相同
#  2.  每一个噪音值应该为满足标准正态分布的随机值20倍
noise = np.random.randn(h, w, c) * 20

#  把原图加上噪音构建包含噪音图
img_noise = noise + img

#  加上后如果不处理,  RGB三个通道的范围就超越0~255整型(或0~1浮点数)了
#  所以我们要把三个通道都极小极大值归一化
#  把图像改成二维结构，只有三列，每列对应一个RGB通道
img_temp = img_noise.reshape(-1, 3)

rgb_min = np.min(img_temp, axis=0)  # 沿列得到RGB的最小值

rgb_max = np.max(img_temp, axis=0)  # 沿列得到RGB的最大值

img_noise = ((img_noise - rgb_min) / (rgb_max - rgb_min)).reshape(h, w, c)  # 沿着3列做极小极大值归一，然后reshape回原图结构

#  在1个画板上绘制2附子图,  画板高5，宽10
#  第1个子图显示原始灰度图
#  第2个子图显示噪音灰度图
#  2个子图都已灰白色调显示
#  调整子图位置
#  并以最紧凑模式保存plt.show()对应显示内容到  out.png
fg, ax = plt.subplots(1, 2, figsize=(10, 5))
ax[0].imshow(img, cmap='gray')
ax[1].imshow(img_noise, cmap='gray')
plt.tight_layout()
plt.savefig('out.png', bbox_inches='tight')
plt.show()
